package compilarclassejava;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;

import propertieslinguagem.SingletonSetaLinguagemEArmazenaResourceBundle;

/*esta classe vai fazer o seguinte:
 * dado um endereco para um arquivo .java que sera testado, leremos todo o arquivo java e armazenaremos
 * cada um dos comandos java encontrados em uma String diferente e armazenaremos essas strings em
 * uma linkedlist. Se durante a leitura acharmos uma leitura do teclado ou escrita no terminal
 * (em java isso eh system.out e system.in), colocaremos um comentario que diz ao usuario onde
 * no codigo dele iremos substituir essa leitra/escrita por uma variavel*/
public class LerArquivoJavaEComentarOndeEstaoVariaveis 
{
	private int quantasLeiturasDeTecladoForaAchadas;
	private int quantasEscritasNoTerminalForamAchadas;
	private String nomeScannerEncontradoEmArquivoLido;
	private LinkedList<String> linhasLidasDoJavaComComentarios;
	
	public LerArquivoJavaEComentarOndeEstaoVariaveis()
	{
		this.quantasEscritasNoTerminalForamAchadas = 0;
		this.quantasLeiturasDeTecladoForaAchadas = 0;
		this.nomeScannerEncontradoEmArquivoLido = "nomeScannerTestTable";
		this.linhasLidasDoJavaComComentarios = new LinkedList<String>();
	}
	
	public void lerEComentarAsLinhasDoArquivoJava(String enderecoArquivoJava)
	{
		try
		{
		      InputStream file = new FileInputStream(enderecoArquivoJava);
		     
		      InputStreamReader leLinhasArquivoJava = new InputStreamReader(file);
		      BufferedReader bufferLeLinhasArquivo = new BufferedReader(leLinhasArquivoJava);
		     
		      try
		      {
		    	  String linhaLidaArquivoJava = bufferLeLinhasArquivo.readLine();
		    	  while(linhaLidaArquivoJava != null)
		    	  {
		    		  if(linhaLidaArquivoJava.contains("System.out") || linhaLidaArquivoJava.contains("printf"))
			    	  {
		    			  String comandoJavaLido = "";
		    			  boolean pontoEVirgulaFoiAchado = false;
		    			  while(pontoEVirgulaFoiAchado == false)
		    			  {
		    				  for(int i = 0; i < linhaLidaArquivoJava.length(); i++)
		    				  {
		    					  String umCaractere = String.valueOf(linhaLidaArquivoJava.charAt(i));
		    					  comandoJavaLido = comandoJavaLido + umCaractere;
		    					  //System.out.println("caractere percorrido:" + umCaractere);
		    					  if(umCaractere.compareTo(";") == 0)
		    					  {
		    						  pontoEVirgulaFoiAchado = true;
		    						  break;
		    					  }
		    				  }
		    				  
		    				  if(pontoEVirgulaFoiAchado == false)
		    				  {
		    					  //vamos ter de ler outra linha...
		    					  linhaLidaArquivoJava = bufferLeLinhasArquivo.readLine();
		    				  }
		    				  
		    				 
		    			  }
		    			  
		    			 //comando java foi achado
		    			  
	    				  String novoComandoJava = "";
	    				  
	    				  novoComandoJava = criarComentarioVariavelTestTableSaida(comandoJavaLido);
	    				  
			    		  //achamos a linha que contem o booleanao que procuramos!
			    		  linhaLidaArquivoJava = novoComandoJava;
			    	  }
		    		  else if(linhaLidaArquivoJava.contains("Scanner"))
		    		  {
		    			  pegarNomeDoScannerLeDoTeclado(linhaLidaArquivoJava);
		    			  
		    		  }
		    		  else if(linhaLidaArquivoJava.contains(nomeScannerEncontradoEmArquivoLido + ".next()") 
		    				  || linhaLidaArquivoJava.contains(nomeScannerEncontradoEmArquivoLido + ".nextLine()") 
		    				  || linhaLidaArquivoJava.contains("scanf"))
		    		  {
		    			  linhaLidaArquivoJava = criarComentarioVariavelTestTableEntrada(linhaLidaArquivoJava);
		    		  }
		    		  
		    		  this.linhasLidasDoJavaComComentarios.add(linhaLidaArquivoJava);
		    		  linhaLidaArquivoJava = bufferLeLinhasArquivo.readLine();
			    	 
		    	  }
		      }
		      finally
		      {
		         
		    	  bufferLeLinhasArquivo.close();
		    	  leLinhasArquivoJava.close();
		    	  file.close();
		      }
		    }  
		    catch(Exception ex){
		      ex.printStackTrace();
		    }
		
	}
	
	private String criarComentarioVariavelTestTableSaida(String comandoComSaidaNoTerminal)
	{
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		String tituloVariavelSaida = conheceLinguagemDoSistema.getString("variavelSaidaLerArquivoJavaEComentarOndeEstaoVariaveis");
		
		String novoComando = comandoComSaidaNoTerminal + tituloVariavelSaida + this.quantasEscritasNoTerminalForamAchadas;
		this.quantasEscritasNoTerminalForamAchadas = quantasEscritasNoTerminalForamAchadas + 1;
		return novoComando;
	}
	
	private String criarComentarioVariavelTestTableEntrada(String comandoComLeituraDoTeclado)
	{
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		String tituloVariavelEntrada = conheceLinguagemDoSistema.getString("variavelEntradaLerArquivoJavaEComentarOndeEstaoVariaveis");
		
		String novoComando = comandoComLeituraDoTeclado + tituloVariavelEntrada + this.quantasLeiturasDeTecladoForaAchadas;
		this.quantasLeiturasDeTecladoForaAchadas = quantasLeiturasDeTecladoForaAchadas + 1;
		return novoComando;
	}
	
	private void pegarNomeDoScannerLeDoTeclado(
			String linhaLidaArquivoJava) 
	{
		//encontramos um scanner que o programa ira usar para ler coisas do teclado
		  String auxilarLeituraLinhaLidaArquivoJava = "";
		  for(int k = 0; k < linhaLidaArquivoJava.length(); k++)
		  {
			  auxilarLeituraLinhaLidaArquivoJava =
					  auxilarLeituraLinhaLidaArquivoJava + linhaLidaArquivoJava.charAt(k);
			  if(auxilarLeituraLinhaLidaArquivoJava.contains("Scanner"))
			  {
				  String auxNomeDaVariavelScanner = "";
				  String umCaractere = "";
				  for(int l = k + 1; l < linhaLidaArquivoJava.length(); l++)
				  {
					  umCaractere = String.valueOf(linhaLidaArquivoJava.charAt(l));
					  if(umCaractere.compareTo(" ") != 0 & umCaractere.compareTo("=") != 0)
					  {
						  auxNomeDaVariavelScanner = auxNomeDaVariavelScanner + umCaractere;
					  }
					  else if(umCaractere.compareTo("=") == 0)
					  {
						  nomeScannerEncontradoEmArquivoLido = auxNomeDaVariavelScanner;
						  break;
					  }
					  
				  }
				  break;
			  }
		  }
	}

	public LinkedList<String> getLinhasLidasDoJavaComComentarios() {
		return linhasLidasDoJavaComComentarios;
	}

}
